/**
 * 统计不重复元素个数，输⼊为逗号分隔的字符串
 * # Arguments
 * * `num_str` - 输入，格式为：值(进制)，例如：9(10)表示10进制的9，1111(2)表示2进行的15
 * * `to_base` - 目标进制
 * # Returns
 * 转换后的字符串，
 * # Examples
```
let v = solution2::converter::convert_base("1111(2)", 15);
assert_eq!(v, "10");
```
 */
pub fn convert_base(num_str: &str, to_base: u32) -> String {
    convert_base_option(num_str, to_base).unwrap_or(String::new())
}

/**
 * 统计不重复元素个数，输⼊为逗号分隔的字符串
 * # Arguments
 * * `num_str` - 输入，格式为：值(进制)，例如：9(10)表示10进制的9，1111(2)表示2进行的15
 * * `to_base` - 目标进制
 * # Returns
 * 转换后的字符串或空
```
 */
fn convert_base_option(num_str: &str, to_base: u32) -> Option<String> {
    let (from_str, other_str) = num_str.split_once("(")?;

    let (from_base, other_str) = other_str.split_once(")")?;
    if other_str != "" {
        return None;
    }
    let from_base = from_base.parse::<u32>().ok()?;
    // 系统库有方法就直接用了，自己写也不是不行
    let mut from_value = i32::from_str_radix(from_str, from_base).ok()?;
    let mut to_value = String::new();
    let neg = if from_value < 0 {
        from_value = -from_value;
        true
    } else {
        false
    };
    let to_base = to_base as i32;
    while from_value > 0 {
        let n = from_value % to_base;
        if n < 10 {
            to_value.push((n + 48) as u8 as char);
        } else {
            to_value.push((n + 87) as u8 as char);
        }
        from_value = from_value / to_base;
    }
    if neg {
        to_value.push('-');
    }
    Some(to_value.chars().rev().collect::<String>())
}
